package cn.itcast.zt.java8.algorithm;

import java.util.ArrayList;
import java.util.List;

/**
 * 获取一个数组的所有子数组
 * @author zhangtian105
 * @date 2024/1/15
 * @apiNote
 */
public class ArrayAllSub {
    /**
     * 调用递归函数
     * @param array 输入的数组
     * @param index 当前遍历的数组索引
     * @param currentCombination 当前生成的组合  每个位置的决策结果存放集合
     * @param combinations 结果集 - 子数组集合
     */
    public static void generateCombinations(int[] array, int index, List<Integer> currentCombination, List<List<Integer>> combinations) {
        // 决策完数组最后一个位置后，将结果记录到combinations
        if (index == array.length) {
            // 注意：Java中list是引用类型，所以这里需要将决策完的结果【拷贝一份】然后放入结果集
            combinations.add(new ArrayList<>(currentCombination)) ;
            return;
        }

        // 对于每个位置都有两种选择，要或者不要，定了index位置后，然后去决策index+1的位置
        // 1、要当前位置的数
        currentCombination.add(array[index]) ;
        generateCombinations(array, index + 1, currentCombination, combinations);

        // 2、不要当前位置的数（这里注意要把上面add的数remove掉，注意这里是按照数组下标去remove的）
        currentCombination.remove(currentCombination.size() - 1) ;
        generateCombinations(array, index + 1, currentCombination, combinations);
    }
}
